package DataAccess;



import DataAccess.entity.Criteria;
import DataAccess.entity.Property;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

//<p>Class description: Classe per la gestione delle interazioni con il Db (Data Mapper)</p>

/**
 * Permette di interrogare il DB
 */
public class ManagerDatabase {
    
        /*
         * Dati di accesso al db
         */
    private static String nomeDb;
    private static String utenteDb;
    private static String passwordDb;
    private static String urlDb;
    
    private static Connection connection;
    
    
    /**
     * Permette di stabilire una connessione col DB
     */
    public static void connettiDb(){
        try {
            setValoriDb();
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            connection = DriverManager.getConnection(urlDb+nomeDb+"?user="+utenteDb+"&password="+passwordDb);
        } 		catch (ClassNotFoundException cnfex){
            dbException(0,cnfex.getClass().toString());
            System.exit(1);
        }
        
        catch(SQLException sqlex){
            dbException(1,sqlex.getClass().toString());
            System.exit(1);
        } catch (InstantiationException iex) {
            dbException(2,iex.getClass().toString());
        } catch (IllegalAccessException iaex) {
            dbException(3,iaex.getClass().toString());
        }
    }
    
    
    /**
     * Permette di chiudere la connessione col DB
     */
    public static void disconnettiDb() {
        try {
            connection.close();
        } catch (SQLException e) {
            dbException(4,e.getClass().toString());
        }
    }
    
    /**
     * Permette di salvare nel DB i dati di report
     * @param dati_da_inserire Dati di report
     * @return True se l'operazione � andata a buon fine
     */
    public static boolean inserimentoReport(HashMap dati_da_inserire){
        Statement statement;
        int result = 0;
        connettiDb();
        try{
            statement = connection.createStatement();
            result = statement.executeUpdate(QueryDatabase.insertReport(dati_da_inserire));
            statement.close();
        } catch (SQLException e) {
            dbException(9,e.getClass().toString());
        }
        disconnettiDb();
        if (result == 0) return true;
        else return false;
    }
    
    
    
    /**
     * Ricerca i parametri di lookup in base al nome del file sorgente
     * @param nomesorgente Nome file sorgente
     * @return Parametri di lookup
     */
    public static ResultSet ricercaSourceLookup(String nomesorgente) {
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {//setValoriDb();
            statement = connection.createStatement();
//            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaSourceLookup(nomesorgente));
        } catch (SQLException e) {
            dbException(11,e.getClass().toString());
        }
        
        return risultatiRicerca;
    }
    
   
    private static ArrayList<Integer> getListaID(ResultSet rs) throws SQLException {
        ArrayList<Integer> ListaID = new ArrayList<Integer>();
        Integer id;
        int id_temp;
        rs.beforeFirst();
        
        while (rs.next()){
            id_temp = rs.getInt(1);
            id = new Integer(id_temp);
            ListaID.add(id);
            
        }
        
        return ListaID;
        
    }
    
    /**
     * Setta i valori necessari per accedere al DB
     */
    public static void setValoriDb(){
        File file = new File("attributiDb.txt");
        try {
            FileReader f = new FileReader(file);
            Scanner scanner = new Scanner(f);
            urlDb = scanner.next();
            nomeDb = scanner.next();
            utenteDb = scanner.next();
            if(scanner.hasNext())
                passwordDb = scanner.next();
            else
                passwordDb = "";
            scanner.close();
            
            try {
                f.close();
            } catch (IOException e) {
                dbException(20,e.getClass().toString());
            }
            
            
        } catch (FileNotFoundException e) {
            dbException(19,e.getClass().toString());
        }
    }
    
        
    /**
     * Permette di visualizzare un messaggio di errore nel caso di eccezioni causate da operazioni con il DB
     * @param errCode codice errore
     * @param code descrizione
     */
    public static void dbException(int errCode,String code){
       // new eMessage(errCode,code);
    }

    public static ResultSet ricercaListaClienti() {
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaListaClienti());
            
        } catch (SQLException e) {
            dbException(11,e.getClass().toString());
        }
        
        return risultatiRicerca;
    }
    public static ResultSet ricercaListaClienti(ArrayList<Criteria> listaCriteri) {
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaListaClienti(listaCriteri));
            
        } catch (SQLException e) {
            dbException(11,e.getClass().toString());
        }
        
        return risultatiRicerca;
    }

    public static ResultSet ricercaClienteFornitore(int indice) {
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaClienteFornitore(indice));
        } catch (SQLException e) {
            dbException(11,e.getClass().toString());
        }
        
        return risultatiRicerca;
    }

    public static ResultSet ricercaListaFornitori() {
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaListaFornitori());
        } catch (SQLException e) {
            dbException(11,e.getClass().toString());
        }
        
        return risultatiRicerca;
    }

    public static ResultSet ricercaListaOrdiniclienti() {
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaListaOrdiniclienti());
        } catch (SQLException e) {
            dbException(11,e.getClass().toString());
        }
        
        return risultatiRicerca;
    }
    public static ArrayList<Property> ottieniCampi(String C_F) {
        ArrayList<Property> listaCampi = new ArrayList<Property>();
               
        Statement statement;
        ResultSet risultatiRicerca = null;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ricercaCampiClienteFornitore(C_F));
            for (int i = 1; i <= risultatiRicerca.getMetaData().getColumnCount(); i++) {
                Property p = new Property(  risultatiRicerca.getMetaData().getColumnName(i),
                                            risultatiRicerca.getMetaData().getColumnLabel(i),
                                            risultatiRicerca.getMetaData().getColumnTypeName(i));
                listaCampi.add(p);
            }
            
            
        } catch (SQLException e) {
            return listaCampi;
        }
        
        return listaCampi;
        
    }

    public static Integer ottieniNuovo_nFattura() {
        Statement statement;
        ResultSet risultatiRicerca = null;
        Integer i = 1;
        try {
            setValoriDb();
            statement = connection.createStatement();
            risultatiRicerca=statement.executeQuery(QueryDatabase.ottieniNuovo_nFattura());
            if (risultatiRicerca.first()) {
                i = risultatiRicerca.getInt(1);
                i = i + 1;
            }
        } catch (SQLException e) {
            return i;
        }
        
        return i;
    }

    
    
    
   
}
